package br.museu.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.joda.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import br.museu.constantes.ConstantesModelAndView;
import br.museu.constantes.ConstantesSistema;
import br.museu.model.Evento;
import br.museu.model.Usuario;
import br.museu.model.enums.TipoUsuario;
import br.museu.model.json.JSONRetorno;
import br.museu.model.json.JSONRetorno.JSONStatus;
import br.museu.negocio.interfaces.IEventoNegocio;

import com.google.gson.Gson;

@Controller
public class EventoController extends GenericController {

	@Autowired
	private IEventoNegocio eventoNegocio;

	@RequestMapping(value = "cadastroEvento", method = RequestMethod.GET)
	public ModelAndView cadastroEvento(HttpServletRequest request) {
		ModelAndView mv = new ModelAndView(ConstantesModelAndView.cadastroEvento);

		Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");

		if (usuario.getTipo().equals(TipoUsuario.VISITANTE)) {
			mv.setViewName(ConstantesModelAndView.pagina_erro);
			mv.addObject("mensagem", "Você não tem permissão para acessar esta página.");
			return mv;
		}

		mv.addObject("evento", new Evento());

		return mv;
	}

	@RequestMapping(value = "validarEvento", method = RequestMethod.POST)
	public @ResponseBody String cadastrarAtualizarEvento(HttpServletRequest request) {
		JSONRetorno retorno = new JSONRetorno(JSONStatus.sucesso);

		try {

			String nome = request.getParameter("nome");
			String dtInicio = request.getParameter("dtInicio");
			String dtFim = request.getParameter("dtFim");
			String qtdTickets = request.getParameter("qtdTickets");
			String valorTicket = request.getParameter("valorTicket");

			eventoNegocio.validarEvento(nome, dtInicio, dtFim, qtdTickets, valorTicket);

		} catch (Exception e) {
			retorno.setStatus(JSONStatus.erro);
			retorno.setMensagem(e.getMessage());
		}

		return new Gson().toJson(retorno);
	}

	@RequestMapping(value = "cadastrarAtualizarEvento", method = RequestMethod.POST)
	public ModelAndView cadastrarAtualizarEvento(@ModelAttribute Evento evento, BindingResult result, HttpServletRequest request) {
		ModelAndView mv = new ModelAndView(ConstantesModelAndView.cadastroEvento);

		try {

			String dtIni = request.getParameter("dtInicio");
			String dtFim = request.getParameter("dtFim");

			evento.setDtInicio(new LocalDate(dtIni));
			evento.setDtFim(new LocalDate(dtFim));

			eventoNegocio.cadastrarAlterarEvento(evento);
			mv.addObject("evento", evento);

		} catch (Exception e) {
			mv.setViewName(ConstantesModelAndView.pagina_erro);
			mv.addObject("mensagem", e.getMessage());
		}

		return mv;
	}

	@RequestMapping(value = "listarEventos", method = RequestMethod.GET)
	public ModelAndView listarEventos(HttpServletRequest request) {
		ModelAndView mv = new ModelAndView(ConstantesModelAndView.listarEventos);

		String filtro = request.getParameter("filtro");
		String dtInicio = request.getParameter("dtInicio");
		String dtFim = request.getParameter("dtFim");

		try {
			List<Evento> listaEventos = eventoNegocio.listarEventos(filtro, dtInicio, dtFim);
			String temEvento = ConstantesSistema.NAO;

			if (!listaEventos.isEmpty()) {
				mv.addObject("listaEventos", listaEventos);
				temEvento = ConstantesSistema.SIM;
			}

			mv.addObject("temEvento", temEvento);

		} catch (Exception e) {
			mv.setViewName(ConstantesModelAndView.pagina_erro);
			mv.addObject("mensagem", e.getMessage());
		}

		return mv;
	}

}
